<?php
	function email($mailTo,$subject,$content,$type="HTML",$debug = false){
		import('Spark.Util.Smtp');
		$host = C('MAIL_HOST');				//SMTP服务器
		$port = C('MAIL_PORT');				//SMTP服务器端口
		$smtpuser = C('MAIL_USER');			//SMTP服务器的用户帐号
		$smtppass = C('MAIL_PASSWD');		//SMTP服务器的用户密码
		$mailFrom = C('MAIL_FROM');		//发送邮件的用户邮箱
		$smtp = new Smtp($host,$port,true,$smtpuser,$smtppass);
		$smtp->debug = $debug;				//是否显示发送的调试信息
		$state = $smtp->sendmail($mailTo, $mailFrom, $subject, $content, $type);
		
		return $state;
	}
	
	//生成带域名的链接
	function site_url($url){
		return C('SITE_URL').$url;
	}
	
	/**
	 *@function bdmap 根据地址信息生成百度地图调用链接
	 *@param $title 标注点标题
	 *@param $address 标注点详细地址
	 *@param $latitude 纬度
	 *@param $longitude 经度
	 */
	function bdmap($title,$address,$latitude,$longitude){
		return "http://api.map.baidu.com/marker?location={$latitude},{$longitude}&title={$title}&content={$address}&output=html";
	}
	
	function tmap($title,$address,$latitude,$longitude){
		return "http://apis.map.qq.com/uri/v1/marker?marker=coord:{$latitude},{$longitude};title:{$title};addr:{$address}&coord_type=1";
	}
	
	function bdstaticmap($lat,$lng,$zoom=14,$width=640,$height=320){
		return "http://api.map.baidu.com/staticimage?center='.$lng,$lat&width=$width&height=$height&zoom=$zoom&markers=$lng,$lat&markerStyles=l";
	}
	
	function tstaticmap($lat,$lng,$zoom=14,$width=640,$height=320){
		return "http://st.map.qq.com/api?size={$width}*{$height}&center={$lng},{$lat}&zoom={$zoom}&markers={$lng},{$lat},1"; 
	}
	
	/**
	 *@增强U 函数功能，默认带token和wechat_id参数
	 */
	function WU($module,$param=[],$withDomain = false){
		if(empty($param['token'])){
			$token = $token?$token:session('token');
			$param['token'] = $token;
		}
		if(empty($param['wechat_id'])){
			$wechat_id = $wechat_id?$wechat_id:session('wechat_id');
			$param['wechat_id'] = $wechat_id;
		}
		if($withDomain){
			return rtrim(C('wap_domain'),'/').U($module,$param);
		}
		else{
			return U($module,$param);
		}
	}
	
	function is_login(){
		$user = session('user_auth');
		if (empty($user)) {
			return 0;
		} else {
			return session('user_auth_sign') == data_auth_sign($user) ? $user['uid'] : 0;
		}
	}

	/**
	 * 检测当前用户是否为管理员
	 * @return boolean true-管理员，false-非管理员
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function is_administrator($uid = null){
		$uid = is_null($uid) ? is_login() : $uid;
		return $uid && (intval($uid) === C('USER_ADMINISTRATOR'));
	}

	/**
	 * 字符串转换为数组，主要用于把分隔符调整到第二个参数
	 * @param  string $str  要分割的字符串
	 * @param  string $glue 分割符
	 * @return array
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function str2arr($str, $glue = ','){
		return explode($glue, $str);
	}

	/**
	 * 数组转换为字符串，主要用于把分隔符调整到第二个参数
	 * @param  array  $arr  要连接的数组
	 * @param  string $glue 分割符
	 * @return string
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function arr2str($arr, $glue = ','){
		return implode($glue, $arr);
	}

	/**
	 * 系统加密方法
	 * @param string $data 要加密的字符串
	 * @param string $key  加密密钥
	 * @param int $expire  过期时间 单位 秒
	 * @return string
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function think_encrypt($data, $key = '', $expire = 0) {
		$key  = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
		$data = base64_encode($data);
		$x    = 0;
		$len  = strlen($data);
		$l    = strlen($key);
		$char = '';

		for ($i = 0; $i < $len; $i++) {
			if ($x == $l) $x = 0;
			$char .= substr($key, $x, 1);
			$x++;
		}

		$str = sprintf('%010d', $expire ? $expire + time():0);

		for ($i = 0; $i < $len; $i++) {
			$str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1)))%256);
		}
		return str_replace(array('+','/','='),array('-','_',''),base64_encode($str));
	}

	/**
	 * 系统解密方法
	 * @param  string $data 要解密的字符串 （必须是think_encrypt方法加密的字符串）
	 * @param  string $key  加密密钥
	 * @return string
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function think_decrypt($data, $key = ''){
		$key    = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
		$data   = str_replace(array('-','_'),array('+','/'),$data);
		$mod4   = strlen($data) % 4;
		if ($mod4) {
		   $data .= substr('====', $mod4);
		}
		$data   = base64_decode($data);
		$expire = substr($data,0,10);
		$data   = substr($data,10);

		if($expire > 0 && $expire < time()) {
			return '';
		}
		$x      = 0;
		$len    = strlen($data);
		$l      = strlen($key);
		$char   = $str = '';

		for ($i = 0; $i < $len; $i++) {
			if ($x == $l) $x = 0;
			$char .= substr($key, $x, 1);
			$x++;
		}

		for ($i = 0; $i < $len; $i++) {
			if (ord(substr($data, $i, 1))<ord(substr($char, $i, 1))) {
				$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
			}else{
				$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
			}
		}
		return base64_decode($str);
	}

	/**
	 * 数据签名认证
	 * @param  array  $data 被认证的数据
	 * @return string       签名
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function data_auth_sign($data) {
		//数据类型检测
		if(!is_array($data)){
			$data = (array)$data;
		}
		ksort($data); //排序
		$code = http_build_query($data); //url编码并生成query字符串
		$sign = sha1($code); //生成签名
		return $sign;
	}

	/**
	* 对查询结果集进行排序
	* @access public
	* @param array $list 查询结果
	* @param string $field 排序的字段名
	* @param array $sortby 排序类型
	* asc正向排序 desc逆向排序 nat自然排序
	* @return array
	*/
	function list_sort_by($list,$field, $sortby='asc') {
	   if(is_array($list)){
		   $refer = $resultSet = array();
		   foreach ($list as $i => $data)
			   $refer[$i] = &$data[$field];
		   switch ($sortby) {
			   case 'asc': // 正向排序
					asort($refer);
					break;
			   case 'desc':// 逆向排序
					arsort($refer);
					break;
			   case 'nat': // 自然排序
					natcasesort($refer);
					break;
		   }
		   foreach ( $refer as $key=> $val)
			   $resultSet[] = &$list[$key];
		   return $resultSet;
	   }
	   return false;
	}

	/**
	 * 把返回的数据集转换成Tree
	 * @param array $list 要转换的数据集
	 * @param string $pid parent标记字段
	 * @param string $level level标记字段
	 * @return array
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
		// 创建Tree
		$tree = array();
		if(is_array($list)) {
			// 创建基于主键的数组引用
			$refer = array();
			foreach ($list as $key => $data) {
				$refer[$data[$pk]] =& $list[$key];
			}
			foreach ($list as $key => $data) {
				// 判断是否存在parent
				$parentId =  $data[$pid];
				if ($root == $parentId) {
					$tree[] =& $list[$key];
				}else{
					if (isset($refer[$parentId])) {
						$parent =& $refer[$parentId];
						$parent[$child][] =& $list[$key];
					}
				}
			}
		}
		return $tree;
	}

	/**
	 * 将list_to_tree的树还原成列表
	 * @param  array $tree  原来的树
	 * @param  string $child 孩子节点的键
	 * @param  string $order 排序显示的键，一般是主键 升序排列
	 * @param  array  $list  过渡用的中间数组，
	 * @return array        返回排过序的列表数组
	 * @author yangweijie <yangweijiester@gmail.com>
	 */
	function tree_to_list($tree, $child = '_child', $order='id', &$list = array()){
		if(is_array($tree)) {
			$refer = array();
			foreach ($tree as $key => $value) {
				$reffer = $value;
				if(isset($reffer[$child])){
					unset($reffer[$child]);
					tree_to_list($value[$child], $child, $order, $list);
				}
				$list[] = $reffer;
			}
			$list = list_sort_by($list, $order, $sortby='asc');
		}
		return $list;
	}

	/**
	 * 格式化字节大小
	 * @param  number $size      字节数
	 * @param  string $delimiter 数字和单位分隔符
	 * @return string            格式化后的带单位的大小
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function format_bytes($size, $delimiter = '') {
		$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
		for ($i = 0; $size >= 1024 && $i < 5; $i++) $size /= 1024;
		return round($size, 2) . $delimiter . $units[$i];
	}

	/**
	 * 设置跳转页面URL
	 * 使用函数再次封装，方便以后选择不同的存储方式（目前使用cookie存储）
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function set_redirect_url($url){
		cookie('redirect_url', $url);
	}

	/**
	 * 获取跳转页面URL
	 * @return string 跳转页URL
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function get_redirect_url(){
		$url = cookie('redirect_url');
		return empty($url) ? __APP__ : $url;
	}

	/**
	 * 处理插件钩子
	 * @param string $hook   钩子名称
	 * @param mixed $params 传入参数
	 * @return void
	 */
	function hook($hook,$params=array()){
		\Think\Hook::listen($hook,$params);
	}

	/**
	 * 获取插件类的类名
	 * @param strng $name 插件名
	 */
	function get_addon_class($name){
		$class = "Addons\\{$name}\\{$name}Addon";
		return $class;
	}

	/**
	 * 获取插件类的配置文件数组
	 * @param string $name 插件名
	 */
	function get_addon_config($name){
		$class = get_addon_class($name);
		if(class_exists($class)) {
			$addon = new $class();
			return $addon->getConfig();
		}else {
			return array();
		}
	}

	/**
	 * 插件显示内容里生成访问插件的url
	 * @param string $url url
	 * @param array $param 参数
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function addons_url($url, $param = array()){
		$url        = parse_url($url);
		$case       = C('URL_CASE_INSENSITIVE');
		$addons     = $case ? parse_name($url['scheme']) : $url['scheme'];
		$controller = $case ? parse_name($url['host']) : $url['host'];
		$action     = trim($case ? strtolower($url['path']) : $url['path'], '/');

		/* 解析URL带的参数 */
		if(isset($url['query'])){
			parse_str($url['query'], $query);
			$param = array_merge($query, $param);
		}

		/* 基础参数 */
		$params = array(
			'_addons'     => $addons,
			'_controller' => $controller,
			'_action'     => $action,
		);
		$params = array_merge($params, $param); //添加额外参数

		return U('Addons/execute', $params);
	}

	/**
	 * 时间戳格式化
	 * @param int $time
	 * @return string 完整的时间显示
	 * @author huajie <banhuajie@163.com>
	 */
	function time_format($time = NULL,$format='Y-m-d H:i'){
		$time = $time === NULL ? NOW_TIME : intval($time);
		return date($format, $time);
	}

	/**
	 * 根据用户ID获取用户名
	 * @param  integer $uid 用户ID
	 * @return string       用户名
	 */
	function get_username($uid = 0){
		static $list;
		if(!($uid && is_numeric($uid))){ //获取当前登录用户名
			return session('user_auth.username');
		}

		/* 获取缓存数据 */
		if(empty($list)){
			$list = S('sys_active_user_list');
		}

		/* 查找用户信息 */
		$key = "u{$uid}";
		if(isset($list[$key])){ //已缓存，直接使用
			$name = $list[$key];
		} else { //调用接口获取用户信息
			$User = new User\Api\UserApi();
			$info = $User->info($uid);
			if($info && isset($info[1])){
				$name = $list[$key] = $info[1];
				/* 缓存用户 */
				$count = count($list);
				$max   = C('USER_MAX_CACHE');
				while ($count-- > $max) {
					array_shift($list);
				}
				S('sys_active_user_list', $list);
			} else {
				$name = '';
			}
		}
		return $name;
	}

	/**
	 * 根据用户ID获取用户昵称
	 * @param  integer $uid 用户ID
	 * @return string       用户昵称
	 */
	function get_nickname($uid = 0){
		static $list;
		if(!($uid && is_numeric($uid))){ //获取当前登录用户名
			return session('user_auth.username');
		}

		/* 获取缓存数据 */
		if(empty($list)){
			$list = S('sys_user_nickname_list');
		}

		/* 查找用户信息 */
		$key = "u{$uid}";
		if(isset($list[$key])){ //已缓存，直接使用
			$name = $list[$key];
		} else { //调用接口获取用户信息
			$info = M('Member')->field('nickname')->find($uid);
			if($info !== false && $info['nickname'] ){
				$nickname = $info['nickname'];
				$name = $list[$key] = $nickname;
				/* 缓存用户 */
				$count = count($list);
				$max   = C('USER_MAX_CACHE');
				while ($count-- > $max) {
					array_shift($list);
				}
				S('sys_user_nickname_list', $list);
			} else {
				$name = '';
			}
		}
		return $name;
	}

	/**
	 * 获取分类信息并缓存分类
	 * @param  integer $id    分类ID
	 * @param  string  $field 要获取的字段名
	 * @return string         分类信息
	 */
	function get_category($id, $field = null){
		static $list;

		/* 非法分类ID */
		if(empty($id) || !is_numeric($id)){
			return '';
		}

		/* 读取缓存数据 */
		if(empty($list)){
			$list = S('sys_category_list');
		}

		/* 获取分类名称 */
		if(!isset($list[$id])){
			$cate = M('Category')->find($id);
			if(!$cate || 1 != $cate['status']){ //不存在分类，或分类被禁用
				return '';
			}
			$list[$id] = $cate;
			S('sys_category_list', $list); //更新缓存
		}
		return is_null($field) ? $list[$id] : $list[$id][$field];
	}

	/* 根据ID获取分类标识 */
	function get_category_name($id){
		return get_category($id, 'name');
	}

	/* 根据ID获取分类名称 */
	function get_category_title($id){
		return get_category($id, 'title');
	}

	/**
	 * 获取文档模型信息
	 * @param  integer $id    模型ID
	 * @param  string  $field 模型字段
	 * @return array
	 */
	function get_document_model($id = null, $field = null){
		static $list;

		/* 非法分类ID */
		if(!(is_numeric($id) || is_null($id))){
			return '';
		}

		/* 读取缓存数据 */
		if(empty($list)){
			$list = S('DOCUMENT_MODEL_LIST');
		}

		/* 获取模型名称 */
		if(empty($list)){
			$map   = array('status' => 1, 'extend' => 1);
			$model = M('Model')->where($map)->field(true)->select();
			foreach ($model as $value) {
				$list[$value['id']] = $value;
			}
			S('DOCUMENT_MODEL_LIST', $list); //更新缓存
		}

		/* 根据条件返回数据 */
		if(is_null($id)){
			return $list;
		} elseif(is_null($field)){
			return $list[$id];
		} else {
			return $list[$id][$field];
		}
	}

	/**
	 * 解析UBB数据
	 * @param string $data UBB字符串
	 * @return string 解析为HTML的数据
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	function ubb($data){
		//TODO: 待完善，目前返回原始数据
		return $data;
	}

	/**
	 * 记录行为日志，并执行该行为的规则
	 * @param string $action 行为标识
	 * @param string $model 触发行为的模型名
	 * @param int $record_id 触发行为的记录id
	 * @param int $user_id 执行行为的用户id
	 * @return boolean
	 * @author huajie <banhuajie@163.com>
	 */
	function action_log($action = null, $model = null, $record_id = null, $user_id = null){

		//参数检查
		if(empty($action) || empty($model) || empty($record_id)){
			return '参数不能为空';
		}
		if(empty($user_id)){
			$user_id = is_login();
		}

		//查询行为,判断是否执行
		$action_info = M('Action')->getByName($action);
		if($action_info['status'] != 1){
			return '该行为被禁用或删除';
		}

		//插入行为日志
		$data['action_id']      =   $action_info['id'];
		$data['user_id']        =   $user_id;
		$data['action_ip']      =   ip2long(get_client_ip());
		$data['model']          =   $model;
		$data['record_id']      =   $record_id;
		$data['create_time']    =   NOW_TIME;

		//解析日志规则,生成日志备注
		if(!empty($action_info['log'])){
			if(preg_match_all('/\[(\S+?)\]/', $action_info['log'], $match)){
				$log['user']    =   $user_id;
				$log['record']  =   $record_id;
				$log['model']   =   $model;
				$log['time']    =   NOW_TIME;
				$log['data']    =   array('user'=>$user_id,'model'=>$model,'record'=>$record_id,'time'=>NOW_TIME);
				foreach ($match[1] as $value){
					$param = explode('|', $value);
					if(isset($param[1])){
						$replace[] = call_user_func($param[1],$log[$param[0]]);
					}else{
						$replace[] = $log[$param[0]];
					}
				}
				$data['remark'] =   str_replace($match[0], $replace, $action_info['log']);
			}else{
				$data['remark'] =   $action_info['log'];
			}
		}else{
			//未定义日志规则，记录操作url
			$data['remark']     =   '操作url：'.$_SERVER['REQUEST_URI'];
		}

		M('ActionLog')->add($data);

		if(!empty($action_info['rule'])){
			//解析行为
			$rules = parse_action($action, $user_id);

			//执行行为
			$res = execute_action($rules, $action_info['id'], $user_id);
		}
	}

	/**
	 * 解析行为规则
	 * 规则定义  table:$table|field:$field|condition:$condition|rule:$rule[|cycle:$cycle|max:$max][;......]
	 * 规则字段解释：table->要操作的数据表，不需要加表前缀；
	 *              field->要操作的字段；
	 *              condition->操作的条件，目前支持字符串，默认变量{$self}为执行行为的用户
	 *              rule->对字段进行的具体操作，目前支持四则混合运算，如：1+score*2/2-3
	 *              cycle->执行周期，单位（小时），表示$cycle小时内最多执行$max次
	 *              max->单个周期内的最大执行次数（$cycle和$max必须同时定义，否则无效）
	 * 单个行为后可加 ； 连接其他规则
	 * @param string $action 行为id或者name
	 * @param int $self 替换规则里的变量为执行用户的id
	 * @return boolean|array: false解析出错 ， 成功返回规则数组
	 * @author huajie <banhuajie@163.com>
	 */
	function parse_action($action = null, $self){
		if(empty($action)){
			return false;
		}

		//参数支持id或者name
		if(is_numeric($action)){
			$map = array('id'=>$action);
		}else{
			$map = array('name'=>$action);
		}

		//查询行为信息
		$info = M('Action')->where($map)->find();
		if(!$info || $info['status'] != 1){
			return false;
		}

		//解析规则:table:$table|field:$field|condition:$condition|rule:$rule[|cycle:$cycle|max:$max][;......]
		$rules = $info['rule'];
		$rules = str_replace('{$self}', $self, $rules);
		$rules = explode(';', $rules);
		$return = array();
		foreach ($rules as $key=>&$rule){
			$rule = explode('|', $rule);
			foreach ($rule as $k=>$fields){
				$field = empty($fields) ? array() : explode(':', $fields);
				if(!empty($field)){
					$return[$key][$field[0]] = $field[1];
				}
			}
			//cycle(检查周期)和max(周期内最大执行次数)必须同时存在，否则去掉这两个条件
			if(!array_key_exists('cycle', $return[$key]) || !array_key_exists('max', $return[$key])){
				unset($return[$key]['cycle'],$return[$key]['max']);
			}
		}

		return $return;
	}

	/**
	 * 执行行为
	 * @param array $rules 解析后的规则数组
	 * @param int $action_id 行为id
	 * @param array $user_id 执行的用户id
	 * @return boolean false 失败 ， true 成功
	 * @author huajie <banhuajie@163.com>
	 */
	function execute_action($rules = false, $action_id = null, $user_id = null){
		if(!$rules || empty($action_id) || empty($user_id)){
			return false;
		}

		$return = true;
		foreach ($rules as $rule){

			//检查执行周期
			$map = array('action_id'=>$action_id, 'user_id'=>$user_id);
			$map['create_time'] = array('gt', NOW_TIME - intval($rule['cycle']) * 3600);
			$exec_count = M('ActionLog')->where($map)->count();
			if($exec_count > $rule['max']){
				continue;
			}

			//执行数据库操作
			$Model = M(ucfirst($rule['table']));
			$field = $rule['field'];
			$res = $Model->where($rule['condition'])->setField($field, array('exp', $rule['rule']));

			if(!$res){
				$return = false;
			}
		}
		return $return;
	}

	//基于数组创建目录和文件
	function create_dir_or_files($files){
		foreach ($files as $key => $value) {
			if(substr($value, -1) == '/'){
				mkdir($value);
			}else{
				@file_put_contents($value, '');
			}
		}
	}

	if(!function_exists('array_column')){
		function array_column(array $input, $columnKey, $indexKey = null) {
			$result = array();
			if (null === $indexKey) {
				if (null === $columnKey) {
					$result = array_values($input);
				} else {
					foreach ($input as $row) {
						$result[] = $row[$columnKey];
					}
				}
			} else {
				if (null === $columnKey) {
					foreach ($input as $row) {
						$result[$row[$indexKey]] = $row;
					}
				} else {
					foreach ($input as $row) {
						$result[$row[$indexKey]] = $row[$columnKey];
					}
				}
			}
			return $result;
		}
	}

	/**
	 * 获取表名（不含表前缀）
	 * @param string $model_id
	 * @return string 表名
	 * @author huajie <banhuajie@163.com>
	 */
	function get_table_name($model_id = null){
		if(empty($model_id)){
			return false;
		}
		$Model = M('Model');
		$name = '';
		$info = $Model->getById($model_id);
		if($info['extend'] != 0){
			$name = $Model->getFieldById($info['extend'], 'name').'_';
		}
		$name .= $info['name'];
		return $name;
	}

	/**
	 * 获取属性信息并缓存
	 * @param  integer $id    属性ID
	 * @param  string  $field 要获取的字段名
	 * @return string         属性信息
	 */
	function get_model_attribute($model_id, $group = true){
		static $list;

		/* 非法ID */
		if(empty($model_id) || !is_numeric($model_id)){
			return '';
		}

		/* 读取缓存数据 */
		if(empty($list)){
			$list = S('attribute_list');
		}

		/* 获取属性 */
		if(!isset($list[$model_id])){
			$map = array('model_id'=>$model_id);
			$extend = M('Model')->getFieldById($model_id,'extend');

			if($extend){
				$map = array('model_id'=> array("in", array($model_id, $extend)));
			}
			$info = M('Attribute')->where($map)->select();
			$list[$model_id] = $info;
			//S('attribute_list', $list); //更新缓存
		}

		$attr = array();
		foreach ($list[$model_id] as $value) {
			$attr[$value['id']] = $value;
		}

		if($group){
			$sort  = M('Model')->getFieldById($model_id,'field_sort');

			if(empty($sort)){	//未排序
				$group = array(1=>array_merge($attr));
			}else{
				$group = json_decode($sort, true);

				$keys  = array_keys($group);
				foreach ($group as &$value) {
					foreach ($value as $key => $val) {
						$value[$key] = $attr[$val];
						unset($attr[$val]);
					}
				}

				if(!empty($attr)){
					$group[$keys[0]] = array_merge($group[$keys[0]], $attr);
				}
			}
			$attr = $group;
		}
		return $attr;
	}

	/**
	 * 调用系统的API接口方法（静态方法）
	 * api('User/getName','id=5'); 调用公共模块的User接口的getName方法
	 * api('Admin/User/getName','id=5');  调用Admin模块的User接口
	 * @param  string  $name 格式 [模块名]/接口名/方法名
	 * @param  array|string  $vars 参数
	 */
	function api($name,$vars=array()){
		$array     = explode('/',$name);
		$method    = array_pop($array);
		$classname = array_pop($array);
		$module    = $array? array_pop($array) : 'Common';
		$callback  = $module.'\\Api\\'.$classname.'Api::'.$method;
		if(is_string($vars)) {
			parse_str($vars,$vars);
		}
		return call_user_func_array($callback,$vars);
	}

	/**
	 * 根据条件字段获取指定表的数据
	 * @param mixed $value 条件，可用常量或者数组
	 * @param string $condition 条件字段
	 * @param string $field 需要返回的字段，不传则返回整个数据
	 * @param string $table 需要查询的表
	 * @author huajie <banhuajie@163.com>
	 */
	function get_table_field($value = null, $condition = 'id', $field = null, $table = null){
		if(empty($value) || empty($table)){
			return false;
		}

		//拼接参数
		$map[$condition] = $value;
		$info = M(ucfirst($table))->where($map);
		if(empty($field)){
			$info = $info->field(true)->find();
		}else{
			$info = $info->getField($field);
		}
		return $info;
	}

	/**
	 * 获取链接信息
	 * @param int $link_id
	 * @param string $field
	 * @return 完整的链接信息或者某一字段
	 * @author huajie <banhuajie@163.com>
	 */
	function get_link($link_id = null, $field = 'url'){
		$link = '';
		if(empty($link_id)){
			return $link;
		}
		$link = M('Url')->getById($link_id);
		if(empty($field)){
			return $link;
		}else{
			return $link[$field];
		}
	}

	/**
	 * 获取文档封面图片
	 * @param int $cover_id
	 * @param string $field
	 * @return 完整的数据  或者  指定的$field字段值
	 * @author huajie <banhuajie@163.com>
	 */
	function get_cover($cover_id, $field = null){
		if(empty($cover_id)){
			return false;
		}
		$picture = M('Picture')->where(array('status'=>1))->getById($cover_id);
		return empty($field) ? $picture : $picture[$field];
	}

	/**
	 * 检查$pos(推荐位的值)是否包含指定推荐位$contain
	 * @param number $pos 推荐位的值
	 * @param number $contain 指定推荐位
	 * @return boolean true 包含 ， false 不包含
	 * @author huajie <banhuajie@163.com>
	 */
	function check_document_position($pos = 0, $contain = 0){
		if(empty($pos) || empty($contain)){
			return false;
		}

		//将两个参数进行按位与运算，不为0则表示$contain属于$pos
		$res = $pos & $contain;
		if($res !== 0){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * 获取数据的所有子孙数据的id值
	 * @author 朱亚杰 <xcoolcc@gmail.com>
	 */

	function get_stemma($pids,Model &$model, $field='id'){
		$collection = array();

		//非空判断
		if(empty($pids)){
			return $collection;
		}

		if( is_array($pids) ){
			$pids = trim(implode(',',$pids),',');
		}
		$result     = $model->field($field)->where(array('pid'=>array('IN',(string)$pids)))->select();
		$child_ids  = array_column ((array)$result,'id');

		while( !empty($child_ids) ){
			$collection = array_merge($collection,$result);
			$result     = $model->field($field)->where( array( 'pid'=>array( 'IN', $child_ids ) ) )->select();
			$child_ids  = array_column((array)$result,'id');
		}
		return $collection;
	}
	
	function create_qrcode(){
	
	}
	
	function create_nonce_str($length = 32 ){
		$chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
		$str ="";
		for ( $i = 0; $i < $length; $i++ )  {  
			$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
		}  
		return $str;
	}
	
	function create_key($len=16){
		$seed = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		$tmp = '';
		$len = intval($len);
		for ($i = 0; $i < $len; $i++) {
			$tmp .= substr($seed,mt_rand(0, 61),1);
		}
		return $tmp;
	}
	
	function is_valid_openid($openid){
		if((strlen($openid)==28)&& (substr($openid,0,1)=='o')){
			return true;
		}
		else return false;
	}
	
	//生成页面统计代码
	function analysor($param){
		return '<script type="text/javascript" src="'.C('PAGE_ANALYSOR').http_build_query($param).'"></script>';
	}
	
	function url($path,$domain='site_url'){
		return rtrim(C($domain),'/').$path;
	}
	
	function wurl($module,$param=[]){
		return rtrim(C('WAP_DOMAIN'),'/').U($module,$param);
	}
	
	function gen_trade_id($prefix=''){
		list($usec, $sec) = explode(" ", microtime());
		$orderid = date("ymdHis",$sec);
		$orderid .= substr($usec,2,4);
		$orderid .= rand(10,99);
		return $prefix.$orderid;
	}
	
	function qrcode($data){
		Vendor('Qrcode.qrlib');
		if(empty($data)) return '';
		$TMP_DIR = __ROOT__.ltrim(TEMP_PATH,'./').'QRcode/';
		if (!file_exists($TMP_DIR)) mkdir($TMP_DIR);
        
		$PNG_WEB_BASE_URL = C('site_url').'/'.ltrim(TEMP_PATH,'./').'QRcode/';
		$errorCorrectionLevel = 'L';
		if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H')))
        $errorCorrectionLevel = $_REQUEST['level'];    
		
		$matrixPointSize = 4;
		if(isset($_REQUEST['size'])){
			$matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10);
		}
		$filename = md5($data).'.png';
		
		if(!file_exists($TMP_DIR.$filename)) \QRcode::png($data, $TMP_DIR.$filename, $errorCorrectionLevel, $matrixPointSize, 2);
		return $PNG_WEB_BASE_URL.$filename;
	}
	
	function ajax_qrcode_link($url){
		return U('Help/qrcode').'?url='.urlencode($url);
	}
	
	//发送通知短信
	//发送通知短信
	function send_newsms($mobile,$content){
		header("Content-Type: text/html; charset=UTF-8");
		$flag = 0;
		$params='';//要post的数据
		//以下信息自己填以下
//		$argv = array(
//				'name'=>'xzjybg',     //必填参数。用户账号
//				'pwd'=>'D5504AF80900042D93115C17844C',     //必填参数。（web平台：基本资料中的接口密码）
//				'content'=>$content,   //必填参数。发送内容（1-500 个汉字）UTF-8编码
//				'mobile'=>$mobile,   //必填参数。手机号码。多个以英文逗号隔开
//				'stime'=>'',   //可选参数。发送时间，填写时已填写的时间发送，不填时为当前时间发送
//				'sign'=>'西南资本',    //必填参数。用户签名。
//				//'sign'=>'掘金60s',    //必填参数。用户签名
//				'type'=>'pt',  //必填参数。固定值 pt
//				'extno'=>''    //可选参数，扩展码，用户定义扩展码，只能为数字
//		);
		$argv = array(
				'un'=>'N3176154',     //必填参数。用户账号
				'pw'=>'yUqjeDJgYC482a',     //必填参数。（web平台：基本资料中的接口密码）
				'msg'=>"【家园在线】".$content,   //必填参数。发送内容（1-500 个汉字）UTF-8编码
//				'msg'=>"【汕游】您的验证码是987654，请不要告诉他人",   //必填参数。发送内容（1-500 个汉字）UTF-8编码
				'phone'=>$mobile,   //必填参数。手机号码。多个以英文逗号隔开
//				'stime'=>'',   //可选参数。发送时间，填写时已填写的时间发送，不填时为当前时间发送
//				'sign'=>'西南资本',    //必填参数。用户签名。
				//'sign'=>'掘金60s',    //必填参数。用户签名
//				'type'=>'pt',  //必填参数。固定值 pt
				'ex'=>'',    //可选参数，扩展码，用户定义扩展码，只能为数字
				'rd'=>'1' //是否需要状态报告，0表示不需要，1表示需要
		);

		foreach ($argv as $key=>$value) {
			if ($flag!=0) {
				$params .= "&";
				$flag = 1;
			}
			$params.= $key."="; $params.= urlencode($value);// urlencode($value);
			$flag = 1;
		}
//		$url = "http://web.cr6868.com/asmx/smsservice.aspx?".$params; //提交的url地址
		$url = "http://smssh1.253.com/msg/send?".$params; //提交的url地址

//		$con= substr( file_get_contents($url), 0, 1 );  //获取信息发送后的状态
		$con= file_get_contents($url);  //获取信息发送后的状态

        $p1 = strpos( $con, "," );
        $p2 = substr( $con, $p1+1, 1 );
		if($p2 == '0'){
			return true;
		}else{
			return false;
		}
	}

     /*获得ip*/
     function getClientIP()
     {
         global $ip;
         if (getenv("HTTP_CLIENT_IP"))
             $ip = getenv("HTTP_CLIENT_IP");
         else if(getenv("HTTP_X_FORWARDED_FOR"))
             $ip = getenv("HTTP_X_FORWARDED_FOR");
         else if(getenv("REMOTE_ADDR"))
             $ip = getenv("REMOTE_ADDR");
         else $ip = "Unknow";
         return $ip;
     }

     /*判断手机是android还是ios*/
     function get_device_type()
     {
          //全部变成小写字母
          $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
          $type = 'other';
          //分别进行判断
          if(strpos($agent, 'iphone') || strpos($agent, 'ipad'))
         {
          $type = 'ios';
          }

          if(strpos($agent, 'android'))
         {
          $type = 'android';
          }
          return $type;
     }

     function is_weixin()
     {
         if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {
             return true;
         }
             return false;
     }

     //从缓存中获取access_token
    function getAcToke($appid, $secret){

        $apiUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";
        if(S($appid.'_access_token') == false){
            $url = $apiUrl.'&appid='.$appid.'&secret='.$secret;

            $resp = json_decode(HttpClient::curlGet($url));
            if($resp->errcode){
                return $resp->errmsg;
            }
            else{
                S($appid.'_access_token',$resp->access_token,7000 );
                return $resp->access_token;
            }
        }
        return S($appid.'_access_token');
    }


?>